package org.com.behavioralPattern.iteratorPattern;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.Stack;
import java.util.Vector;

/**
 * 迭代器模式
 * @author Jonny
 * @version 1.0
 * @Description:
 * @date 2021/4/27 14:34
 */

/**
 *优点
 * ■ 迭代器模式简化了访问容器元素的操作，具备一个统一的遍历接口。
 * ■ 封装遍历算法，使算法独立于聚集角色。客户无须知道聚集对象的类型，即使聚集对象的类型发生变化，也不会影响遍历过程
 *
 * 缺点
 * ■ 迭代器模式给使用者一个序列化的错觉，从而产生错误。
 * ■ 迭代器的元素都是Object类型，没有类型特征（JDK1.5后通过引入泛型可以解决此问题）。
 *
 * 迭代器现在被广泛地应用，甚至已经成为一个最基础的工具。有些人建议将迭代器模式从 23 种模式中删除，
 * 其原因就是迭代器模式太普通了，已经融合到各个语言和工具中。
 * 在Java语言中，从JDK1.2版本开始，增加了java.util.Iterator接口，
 * 并将Iterator应用到各个聚集类（Collection）中，如 ArrayList、Vector、Stack、HashSet
 * 等集合类都实现了 iterator()方法，返回一个迭代器 Iterator，便于对集合中的元素进行遍历。
 * 也正因为 Java 将迭代器模式已经融合到基本的API中，使我们在项目中无须在独立地写迭代器，直接使用即可，这样既轻松又便捷。
 *
 */
public class IteratorDemo {
    public static void main(String[] args) {
        Vector vector=new Vector();
        vector.add("向量1");
        vector.add("向量2");
        vector.add("向量3");
        vector.add("向量4");
        vector.add("向量5");
        vector.add("向量6");
        vector.add("向量7");
        ArrayList list=new ArrayList();
        list.add("序列1");
        list.add("序列2");
        list.add("序列3");
        list.add("序列4");
        list.add("序列5");
        list.add("序列6");

        Stack stack=new Stack();
        stack.push("A");
        stack.push("B");
        stack.push("C");
        stack.push("D");
        stack.push("E");
        stack.push("F");

        java.util.Iterator iterator=vector.iterator();
        System.out.println("遍历向量中的元素");
        show(iterator);
        System.out.println("遍历队列中的元素");
        show(list.iterator());
        System.out.println("遍历栈中的元素");
        show(stack.iterator());
    }

    private static void show(Iterator iterator) {
        while (iterator.hasNext()){
            System.out.println(iterator.next());
        }
    }
}
